home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
BASICDOC.ZIP
/
BASICDOC.TXT
next >
Wrap
Text File
|
1995-06-17
|
11KB
|
234 lines
╒═══════════════════════════════════════════════════════════════╗
│■ ■ ║
│ ║
│ █████████░ ██░ ║
│ ██░ ██░ ██░ ██░ ██████░ ██░ ████████░ ██░ ██░ ║
│ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ║
│ ██░ ██░ ██░ ██░ ██░ ██░ ████████░ ██░ ██░ ║
│ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ██░ ║
│ █████████░ ████████░ ██░ ██████░ ██░ ██░ ███░ ███░ ║
│ ║
│ T ∙ R ∙ I ∙ A ∙ D ║
│■ ■ ║
└───────────────────────────────────────────────────────────────╜
╔══════════════╗
║ ∙ PRESENTS ∙ ║
╚══════════════╝
Mode 13h Documentary Version 1.5
──────────────────────────────────────────────────────────────────────────────
Written By : Vulture Total Files : 2
File Type : Textfile Release Date : 17th of June 1995
Difficulty : Basic level Filename : BASICDOC.ZIP
──────────────────────────────────────────────────────────────────────────────
Welcome to yet another textfile by Vulture. I decided to write this file for
all starting gfx coders coz I think it is very important to fully understand
the basics. When I started to code graphics, I lost a lotta time just because
I did not acctually knew what I was doing. Maybe this text will prevend this
to happen again to other coders. This file was written for those of you who
really want to get into vga-programming. I will be using plain Turbo Pascal
and just a very small bit of assembler. It won't be very hard to understand.
Yeah, I know there are already lots of trainers on this subject available but
I also have experienced that it can be helpful to read various trainers on the
same subject. Anyway, off we go....
=-=-=-=-=-=-=-=-=-=-=-=-=-= MODE 13H DOCUMENTARY =-=-=-=-=-=-=-=-=-=-=-=-=-=-=
In this document I will cover:
A. How to enter mode 13h
B. Memory layout
C. Place yar first pixels
D. Example program
E. Closing words
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
A. HOW TO ENTER MODE 13H.
Ok, let's start. I will refer to mode 13h as MCGA mode coz this is the
official name of the mode. The MCGA mode has a resolution of 320*200*256
which means that we have 320 pixels along the X-axis and 200 pixels along
the Y-axis. We also have no less than 256 colors to our disposal. Great!
Now, how do we get into this great grafix mode? I mean, before we can do
any graphic related stuff such as plotting pixels, we have to get into the
videomode first. This is done using a bit of inline assembler. Here it is:
Procedure VideoMode(Mode: Byte); Assembler; { Used to switch videomodes }
Asm
mov ah,00 { Set high byte of ax }
mov al,Mode { Select the mode here }
int 10h { Call video interrupt }
End;
The 'Mode' variable should contain $13 if you want to get in gfx-mode or else
$3 if you want to get to text-mode. Pretty easy, uh? :)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
B. MEMORY LAYOUT of MODE 13H.
Right, now we have entered the videomode 13h. What we need to know now is
the way things are organized in the vga memory when using MCGA mode.
This is acctually very easy.
Layout of a VGA-mode 13h screen:
X-AXIS
0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .319
320. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .639
Y 640. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .959
A 960. . . . . .
X
I etc etc etc
S
. . . . . . .63679
63680. . . . . . . . . . . . . . . . . . . . . . . . . . . . .63999
So, as you can see here, the VGA memory in this mode is lineair. To be more
exact: When you show pixel 319, you will see a pixel in the upperRIGHT corner
of the screen. But when you fill pixel 320, you will then see a pixel in the
upperLEFT corner on line 1! (know that the upperleft corner is location 0,0)
But in vga memory these values are situated next to eachother. It may sound a
little strange at this moment but you'll get the hang of it soon. Think of it
as one long string. Range from 0 to 63999 (64000 total). This gives us the 320
pixels on the x-axis and 200 on the y-axis.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
C. PLACING PIXELS ON THE SCREEN.
You can place pixels on the screen by pointing to the spot you want filled
and giving the color of the dot. The color is a number between 0 and 255 coz
we have 256 colors. Now, suppose you want to place a pixel in exactly the
middle of the screen with color blue. What you have to know then is the X and
Y-value of that position and the colorvalue of blue. Well, the X-value should
be 160 since 320/2=160 is the middle of a line. Our Y-value should be 100 coz
200/2 is 100. The colorvalue of blue is 1 (when using the standard pallette).
When you know all this, you must calculate the position on the screen since
the screen layout is lineair and does not work with X and Y values. This is
the formula to do that: Y*320+X. Think about it. It really should be very
easy to understand. So easy infact, that I'm not gonna explain it here...
(hehe, evil grin:))
Anyway, here's a pascal procedure which plots a pixel at X,Y:
Procedure Putpixel(X,Y: Integer; Col: Byte);
Begin
Mem[VGA:(Y*320)+X]:=Col;
End;
Why don't you try X=160, Y=100 and Col=1? You'll see what I mean...
The 'VGA' is a constant which resembles the VGA-segment $a000. This is another
aspect to be understood well. To put it simply it means that 'VGA' points to
the start of the screen. When you plot a pixel you are using a segment and an
offset. The VGA segment is $a000. So, to be more exact: $a000:0000 represents
the upperleft corner of the screen. When you are pointing to a certain pixel,
you are pointing to it's offset from the segment. Think of it this way: The
segment is the start of the screen and the offset is the exact place within
this segment. As said before, you can only adress 64000 pixels in MCGA mode.
(Hmm, acctually 64kB can be adressed but the last bytes are not shown)
Well, you should create a constant 'VGA' by doing this:
Const VGA = $a000;
The above putpixel procedure isn't real fast but it is fast enough for our
purposes right now. If you really want a fast one, you should convert it to
assembler. That's what I have done myself. Hee, if you have troubles coding
in assembler, contact me at one of the Outlaw distros. I'll give you my own
putpixel procedure to work with.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
D. SAMPLE PROGRAM.
Now follows a sample-program which demonstrates the putpixel procedure. Play
with it and learn. . . You could try to draw horizontal and vertical lines...
Program MCGASample; { Demonstrates the basic mode 13h }
Uses Crt;
Const VGA = $a000; { The VGA segment }
Var Ch: Char;
Procedure VideoMode(Mode: Byte); Assembler; { Used to switch videomodes }
Asm
mov ah,00 { Set high byte of ax }
mov al,Mode { Select the mode here }
int 10h { Call video interrupt }
End;
Procedure Putpixel (X,Y: Integer; Col: Byte);
Begin { Puts a pixel at X,Y with color Col }
Mem[VGA:(Y*320)+X] := Col;
End;
Begin
RandoMize;
VideoMode($13); { Get in graphics mode }
Repeat
PutPixel(Random(320), Random(200), Random(255));
Until KeyPressed; { Draw pixels on the screen until a key is pressed }
Ch := Readkey;
VideoMode($3); { Get in text mode }
End.
That's it...
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
E. CLOSING WORDS.
Well, this is all I was about to explain in this short tutorial. You can now
get into the vgamode and plot pixels all across the screen. You should be able
to understand the memory layout in this mode and also the basics behind the
segment and offset things. Take a look at the sample program for a quick
example. It's all pretty basic stuff but be sure to fully understand it all
before moving on to all kinds of cewl fx you want to create. You can loose a
lot of time when you are just fooling around a bit. I know what I'm talking
about... :)
This document was written by Vulture. Although many things concerning MCGA
have not been discussed here, this text should be of some help to you. It's
enough to get you started. Maybe in the future updated versions of this file
will be released but that remaines to be seen.
Hmm, well, the following cr*p is supposed to be stated so here we go:
I (Vulture) take no responsibility for any mistakes found in this document.
So use at your own risk. If you spot errors or have something to add to the
text, don't hesitate to contact me. Phew, that's that... :)
Wanna contact Outlaw for any reason? Then leave mail at one of our distros.
Don't hestitate to mail Outlaw, coz we like to chat with otha scene-people.
Signed: Vulture / Outlaw Triad
─────────────────────────┬───────────────────────┬────────────────────────────
Outlaw Triad Distros : │ Greetz from Outlaw: │ Releases sofar:
─────────────────────────┼───────────────────────┼────────────────────────────
│ │
■ Blue Thunder ■ │ - DemoLisher │ ■ MESSAGE (dosscroller)
■ +31 (0)36-5346967 ■ │ - ThunderHawk │
│ - Ash │ ■ VGA-VUL1 (sources)
│ - The Machine │
■ FireHouse ■ │ - X∙N∙TRiC │ ■ CHAINDOC (textfile)
■ +31 (0)58-2661590 ■ │ - Utter Chaos │
│ - Crusher │ ■ VGA-VUL2 (sources)
│ │
│ - Critical │ ■ BASICDOC (textfile)
Open for more! │ - Da Frisian Force │
│ - Tribal │ + various bbs-intros
│ │
─────────────────────────┴───────────────────────┴────────────────────────────
■ (C) 1995 O∙U∙T∙L∙A∙W T∙R∙I∙A∙D ■
──────────────────────────────────────────────────────────────────────────────